#include "trap.h"    
    .org 0x0                  # 设置程序段的起始地址为0x0
    .text                     # 指示接下来的部分为代码段
    .global _start            # 定义全局符号_start，作为程序入口
    
_start:
    lu12i.w     $a0,-0x7fc00     # 将常数0x80400000加载到寄存器$a0
    addi.w      $a1, $a0, 0x7ff   # 将$a0的值加上0x7ff，结果存入寄存器$a1（a1 = 0x804007ff）
    addi.w      $a2, $a0, -0x7ff  # 将-$7ff加到$a0，结果存入寄存器$a2（a2 = 0x803ff801）
    add.w       $t0, $a1, $a2      # 将$a1和$a2相加，结果存入寄存器$t0（t0 = 0x00800000）  
    pcaddu12i   $s0, 0x00fff       # 将0x00fff添加到当前程序计数器（PC），结果存入寄存器$s0（s0 = 0x80fff010）
    andi        $a3, $a1, 0x88a    # 将$a1与0x88a进行按位与，结果存入寄存器$a3（a3 = 0x0000008a）
    xor         $a4, $a1, $a2      # 将$a1与$a2进行按位异或，结果存入寄存器$a4（a4 = 0x007ffffe）
    addi.w      $a2, $a0, 0x7ff    # 将$a0的值加上0x7ff，结果存入寄存器$a2（a2 = 0x804007ff，与$a1相同）
    beq         $a1, $a2, 0x0004   # 如果$a1等于$a2，则跳转到当前PC + 4（跳过4字节）
    bne         $a1, $a3, 0x0004   # 如果$a1不等于$a3，则跳转到当前PC + 4（跳过4字节）
    andi        $t1, $a1, 0x88a    # 将$a1与0x88a进行按位与，结果存入寄存器$t1（t1 = 0x0000008a）
    andi        $t1, $a1, 0x88a    # 过渡指令，不会运行这一条指令
    addi.w      $a2, $a0, 0x7ff    # 将$a0加上0x7ff，结果存入寄存器$a2（a2 = 0x804007ff，与$a1相同）
    st.w        $a0, $s4, 0x7ff     # 将寄存器$a0的值存储到地址$s4 + 0x7ff
    st.b        $a1, $s4, 0x001     # 将寄存器$a1的值存储到地址$s4 + 0x001
    ld.w        $s5, $s4, 0x7ff      # 从地址$s4 + 0x7ff加载一个字到寄存器$s5（s5 = 0x80400000）
    ld.b        $s6, $s4, 0x001      # 从地址$s4 + 0x001加载一个字节到寄存器$s6（s6 = 0x000000ff）
    blt         $s7, $a1, 0x0004     # 如果$s7小于$a1，则跳转到当前PC + 4（跳过4字节）
    blt         $s7, $t0, 0x0004     # 如果$s7小于$t0，则跳转到当前PC + 4（跳过4字节）
    srl.w       $s3, $a0, $s7        # 将寄存器$a0的值右移$s7位，结果存入寄存器$s3
    sltui       $s7, $s7, 0x1f       # 将$s7与0x1f进行比较，如果$s7小于0x1f，则设置$s7为1；否则设置为0
    HIT_GOOD_TRAP                  # 测试通过，触发良性陷阱
